package cn.edu.xust.communication;

import cn.edu.xust.communication.enums.AmmeterStatusEnum;
import cn.edu.xust.communication.model.Result;
import cn.edu.xust.communication.server.CommonOp;
import cn.edu.xust.communication.server.handler.NettyServerDefaultHandler;
import cn.edu.xust.configuration.exception.Default200Exception;
import cn.edu.xust.configuration.exception.ErrorConstant;
import cn.edu.xust.entity.DeviceEntity;
import cn.edu.xust.util.BCDUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.*;


/**
 *
 */

@Slf4j
public class MyWaterReader {

    /**
     * 水表端的IP
     */
    private DeviceEntity deviceEntity;
    private String ammeterChannelIp;


    public MyWaterReader(DeviceEntity deviceEntity, String ammeterChannelIp) {
        this.deviceEntity = deviceEntity;
        this.ammeterChannelIp = ammeterChannelIp;
    }


    //读取水表现阶段需要的数据
    public Result readAll() throws Default200Exception {
        return this.sendCommand(gencmdForWater());
    }


    /**
     * 发送指令
     */
    private Result sendCommand(String cmd) throws Default200Exception {
        if (StringUtils.isEmpty(this.deviceEntity.getName()) || StringUtils.isEmpty(this.ammeterChannelIp)) {
            throw new Default200Exception(ErrorConstant.data_not_compelete);
        }
        return CommonOp.writeCommand(this.ammeterChannelIp, cmd, UUID.randomUUID().toString());

    }


    /**
     * 水表校验码
     *
     * @return
     */
    public static String calculateChecksum(String s) {
        String[] hexList = s.split(" ");
        int total = 0;
        for (String hex : hexList) {
            total += Integer.parseInt(hex, 16);
        }
        String num = Integer.toHexString(total);
        int length = num.length();
        if (length == 1) {
            return "0" + num;
        } else if (length > 2) {
            return num.substring(length - 2);
        } else {
            return num;
        }
    }


    /**
     * 生成查询指令 超仪科技水表协议
     * FE FE  前导码 固定
     * 68  起始码 固定
     * 10  仪表类型 10冷水 11热水
     * 88 50 15 00 05 35 00  七位地址域 低字节在前，bcd编码
     * 01 控制码
     * 03 数据长度
     * 90 1F 00 数据
     * 52 校验
     * 16 结束
     *
     * @return
     */
    private String gencmdForWater() {
        StringBuffer cmd = new StringBuffer();
        //前导码 4
        cmd.append("FE FE ");
        //起始码 2
        cmd.append("68 ");
        //仪表类型 2   10 冷水    11 热水      jiarh 嘉荣华 直接用 10
        if("jiarh".equals(deviceEntity.getModel())){
            cmd.append("10 ");
        }else{
            if ("coldwt".equals(deviceEntity.getType())) {
                cmd.append("10 ");
            } else {
                cmd.append("11 ");
            }
        }

        //地址域 14
        cmd.append(BCDUtils.processString(deviceEntity.getName())).append(" ");
        //控制码 2
        cmd.append("01 ");
        //数据长度 2
        cmd.append("03 ");
        //数据域 6
        cmd.append("1F 90 00 ");//
        //校验码 2
        cmd.append(calculateChecksum(cmd.substring(6))).append(" ");//
        //结束码 2
        cmd.append("16");//预留位
        return cmd.toString();
    }


}
